/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ve.usb.cep.db.models;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import ve.usb.cep.db.SelectObject;
import ve.usb.cep.db.SelectException;
import ve.usb.cep.db.Session;
import ve.usb.cep.db.domainObjects.Seccion;
import ve.usb.cep.db.modelExceptions.SeccionException;
import ve.usb.cep.util.sqlWhere;


public class SeccionModel{
    Connection conn;
    PreparedStatement rowCountStatement;

    public Seccion set(Seccion seccion)
        throws SeccionException
    {
        if (0 == seccion.getCodigo()){
            add(seccion);
        }else{
            update(seccion);
        }

        return seccion;
    }

    public Seccion add(Seccion seccion)
        throws SeccionException
    {

        conn = Session.connection();

        try{
            PreparedStatement pstmt = conn.prepareStatement("INSERT INTO seccion " +
                "(numero, max_estudiantes, codigo_oferta, codigo_prof, aula)" +
                " VALUES (?, ?, ?, ?, ?)");


            pstmt.setInt(1, seccion.getNumero());
            pstmt.setShort(2, seccion.getMaxEstudiantes());
            pstmt.setInt(3, seccion.getCodigoOferta());
            pstmt.setInt(4, seccion.getCodigoProf());
            pstmt.setString(5, seccion.getAula());
            pstmt.executeUpdate();
        }catch(java.sql.SQLException e){
            e.printStackTrace();
            throw new SeccionException(e.getMessage());
        }
        return seccion;
    }

    public Seccion update(Seccion seccion)
        throws SeccionException
    {

        conn = Session.connection();

        try{
            PreparedStatement pstmt = conn.prepareStatement("UPDATE seccion " +
              "SET numero=?, max_estudiantes=?, codigo_oferta=?, codigo_prof=?, aula=?" +
              " WHERE codigo=?");

            pstmt.setInt(1, seccion.getNumero());
            pstmt.setShort(2, seccion.getMaxEstudiantes());
            pstmt.setInt(3, seccion.getCodigoOferta());
            pstmt.setInt(4, seccion.getCodigoProf());
            pstmt.setString(5, seccion.getAula());
            pstmt.setInt(6, seccion.getCodigo());
            pstmt.executeUpdate();
        }catch(java.sql.SQLException e){
            e.printStackTrace();
            throw new SeccionException(e.getMessage());
        }
        return seccion;
    }

    public void delete(int codigo)
        throws SeccionException
    {
        conn = Session.connection();
        try{
            PreparedStatement p = conn.prepareStatement("DELETE FROM seccion WHERE codigo=?");
            p.setInt(1, codigo);
            p.executeUpdate();
        }catch(SQLException e){
            e.printStackTrace();
            throw new SeccionException(e.getMessage());
        }
    }

    protected Seccion getByField(String field, String value)
       throws SeccionException
    {
        sqlWhere w = new sqlWhere();
        sqlWhere.rule[] c = new sqlWhere.rule[1];
        c[0] = w.new rule();
        c[0].setField(field);
        c[0].setOp("eq");
        c[0].setData(value);
        w.setGroupOp(" AND ");
        w.setRules(c);
        
        ArrayList<Seccion> u = getCustom(new SelectObject((short) 1, (short) 1, "", "", w));
        if (0 == u.size()){
            return null;
        }else{
            return u.get(0);
        }
    }
    public ArrayList<Seccion> getCustom(SelectObject s) 
            throws SeccionException {

        conn = Session.connection();
        s.setConnection(conn);
        s.setFields(Seccion.getFields());
        s.setTypes(Seccion.getTypes());
        s.setTable("seccion");

        PreparedStatement p;
        try{
            p = s.getSearchQuery();
            rowCountStatement = s.getCountQuery();
        }catch(SelectException e){
            e.printStackTrace();
            throw new SeccionException(e.getMessage());
        }

        ArrayList<Seccion> arr = new ArrayList<Seccion>();
        try{
            ResultSet rs = p.executeQuery();
            while (rs.next()){
                arr.add(new Seccion(
                    rs.getInt("codigo"),
                    rs.getInt("numero"),
                    rs.getShort("max_estudiantes"),
                    rs.getInt("codigo_oferta"),
                    rs.getInt("codigo_prof"),
                    rs.getString("aula")
                ));
            }
        }catch(SQLException e){
            e.printStackTrace();
            throw new SeccionException(e.getMessage());
        }

        return arr;
    }

    public int getRowCount()
        throws SeccionException
    {
        try{
            ResultSet rs = rowCountStatement.executeQuery();
            rs.next();
            return rs.getInt(1);
        }catch(SQLException e){
            e.printStackTrace();
            throw new SeccionException(e.getMessage());
        }
    }
}